// pages/order/pay/index.ts

import { GetOrderDetail, CallPayment, UpdateOneOrder, GetPayOrder } from "../../../utils/data/apis";
import { Throttle } from "../../../utils/function/tools";
import msg from "../../../utils/model/msg";
let timer: number | undefined;
const throttle = Throttle();
const app = getApp();
/**
 * @interface 路由入参接口
 */
interface Options extends Record<string, string> {
  orderid: string, // 订单ID
  price: string, // 订单价格
  key: string, // 优惠券码
  userInfo: string, // 用户信息
  [key: string]: string
}
Page({

  /**
   * 页面的初始数据
   */
  data: {
    price: '', // 订单实际支付价格
    userInfo: '', // 用户信息
    orderDetail: '', // 订单详情
    countDown: '', // 倒计时
    infoBox: '', // 视图层infobox
  },
  /**
   * @function 设置倒计时
   */
  setCountDown: function (payendTime: string, status: string) {
    if (status != '2') {
      let msg = '订单不存在';
      if (status == '1') {
        msg = '订单已取消'
      }
      else if (status == '3') {
        msg = '支付成功'
      }
      this.setData({
        countDown: msg,
      })
      return;
    }
    let endTime = new Date(payendTime);
    let present = new Date();
    if (present > endTime) {
      this.setData({
        countDown: '支付超时',
      })
      const order: any = this.data.orderDetail;
      UpdateOneOrder({
        id: order.id,
        payState: '支付失败',
        status:'1',
      }) // 更新支付状态
      msg.HideLoading();
      return;
    }
    let min = endTime.getMinutes() - new Date().getMinutes();
    let second = endTime.getSeconds() - new Date().getSeconds();
    if(min < 0) {
      min += 60;
    }
    let flag: boolean = true; // 首次进入定时器
    const that = this;
    timer = setInterval(() => {
      second--;
      if (second < 0) {
        min--;
        second += 60;
        if (min < 0) {
          that.setData({
            countDown: '支付超时',
          })
          const order: any = this.data.orderDetail;
          UpdateOneOrder({
            id: order.id,
            payState: '支付失败',
            status:'1',
          }) // 更新支付状态
          if (flag) {
            msg.HideLoading();
            flag = false;
          }
          if (timer) {
            clearInterval(timer);
          }
          msg.Fail('订单已超时');
          return;
        }
      }
      let minstr = min.toString(), secondstr = second.toString(); // 转换为字符串，指定2位
      if (minstr.length == 1) { minstr = `0${minstr}` }
      if (secondstr.length == 1) { secondstr = `0${secondstr}` }
      that.setData({
        countDown: `${minstr}:${secondstr}`
      })
      if (flag) {
        msg.HideLoading();
        flag = false;
      }
    }, 1000)

  },
  /**
   * @function 初始化视图层infoBox
   * @param data 
   */
  initInfoBox: function(data: any) {
    const infoBox: any = [
      {type: '', detail: data.coursename, icon: '/svg/hot.svg'},
      {type: '', detail: data.username, icon: '/svg/individual.svg'},
      {type: '', detail: `${data.starttime} ~ ${data.endtime}`, icon: '/svg/plan.svg'},
    ]
    this.setData({
      infoBox: infoBox,
    })
  },
  /**
   * @function 获取订单详情
   */
  getOrderDetail: function (orderid: string) {
    msg.Loading();
    GetOrderDetail({
      id: orderid,
      modelName: 'SignList'
    })
      .then((res: any) => {
        this.setData({
          orderDetail: res.data.data[0],
        })
        this.setCountDown(res.data.data[0].payendTime, res.data.data[0].status); // 设置倒计时
        this.initInfoBox(res.data.data[0]);
      })
      .catch(() => {
        msg.HideLoading();
        msg.Fail('获取订单失败');
      })
  },
  /**
   * @function 取消订单
   */
  cancelOrder: function() {
    msg.Modal('确认取消该订单吗', '取消订单', true)
    .then((res: any) => {
      if(res.confirm) {
        // 确认取消订单
        msg.Loading();
        const orderDetai: any = this.data.orderDetail;
        UpdateOneOrder({
          id: orderDetai.id,
          payState: '订单取消',
          status: '1',
        })
        .then(() => {
          msg.HideLoading();
          msg.Success('订单取消成功');
          setTimeout(() => {
            wx.redirectTo({
              url: '../../individual/apply/index'
            })
          }, 800)
        })
        .catch(() => {
          msg.HideLoading();
          msg.Fail('订单取消失败');
        })
      }
    })
  },
  /**
   * @function 支付订单
   */
  payOrder: function() {
    // 节流，防止多次点击
    throttle(2000)
    .then(() => {
      console.log('发起支付');
      this.callPayment();
    })
    .catch(() => {
      // 触发节流
      msg.Fail('请勿重复点击');
    })
  },
  /**
   * @function 调用支付接口
   */
  callPayment: function() {
    msg.Loading();
    const user = wx.getStorageSync('user'); // 获取用户信息
    const orderDetail: any = this.data.orderDetail; // 订单详情
    CallPayment({
      lowOrderId: orderDetail.id, // 后台雪花算法生成的下游订单号
      payMoney: this.data.price,
      body: orderDetail.coursename, // 课程描述
      notifyUrl: app.globalData.url + 'WxSign/AccepttgPay', // 回调地址
      isMinipg: 1, // 是否小程序
      openId: user.openid, // 用户openid
    })
    .then((res: any) => {
      console.log('支付后台返回数据', res.data);
      const pay_res = JSON.parse(res.data.pay_info);
      const upOrderId = res.data.upOrderId; // 后台雪花算法生成的上游订单号
      wx.requestPayment({
        timeStamp: pay_res.timeStamp.toString(),
        nonceStr: pay_res.nonceStr,
        package: pay_res.package,
        signType: pay_res.signType,
        paySign: pay_res.paySign,
      }) // 调用微信支付
      .then(async (payRes: any) => {
        console.log('微信支付调用成功', payRes);
        const key: any = this.options.key;
        // 向后台发送匹配请求
        await GetPayOrder({
          lowOrderId: orderDetail.id, // 下游订单号
          upOrderId: upOrderId, // 上游订单号
          status: "SUCCESS",
          key: key,
        })
        .then(res => {
          msg.HideLoading();
          console.log('订单支付成功', res);
          msg.Success('支付成功');
        })
        .catch(err => {
          msg.HideLoading();
          console.log('订单支付失败', err);
          msg.Fail('支付失败');
        })
        setTimeout(() => {
          wx.redirectTo({
            url: '../../individual/apply/index',
          })
        }, 500)
      }) // 微信支付调用成功
      .catch(() => {
        msg.HideLoading();
        msg.Fail('支付失败');
      }) // 微信支付调用失败
    }) // 获取后台的上游订单号和支付信息成功
    .catch(() => {
      msg.HideLoading();
      msg.Fail('支付失败');
    }) // 获取后台的上游订单号和支付信息失败
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options: Options) {
    console.log('支付界面', options);
    this.setData({
      userInfo: options.userInfo,
      price: options.price,
    })
    this.getOrderDetail(options.orderid);
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {
    if (timer) {
      clearInterval(timer);
    }
  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})